package com.study.cloud.gateway.core.context;

import com.study.cloud.gateway.common.rule.Rule;
import io.netty.channel.ChannelHandlerContext;

import java.util.Map;
import java.util.function.Consumer;

/**
 * 核心上下文接口
 *
 * @author wangwancheng
 * @create 2025/7/17 13:55
 */
public interface IContext {

    //声明生命周期状态
    /**
     * 一个请求正在执行的壮体啊
     */
    int RUNING = 0;
    /**
     * 标志请求结束 写回response 返回结果
     */
    int WRITTEN = 1;
    /**
     * 响应结果已经返回
     */
    int COMPLETE = 2;
    /**
     * 整个网关请求完毕，彻底结束
     */
    int TERMINATED = -1;

    /**
     * 设置上下文状态为正在运行状态
     */
    void runing();

    /**
     * 设置上下文状态为标记写回状态
     */
    void written();

    /**
     * 设置上下文状态为标记写回成功
     */
    void complete();

    /**
     * 标记网关结束
     */
    void terminated();

    /**
     * 判断运行状态
     */
    boolean isRunning();

    boolean isWritten();

    boolean isComplete();

    boolean isTerminated();

    /**
     * 获取请求协议
     */
    String getProtocol();

    /**
     * 获取请求规则
     */
    Rule getRule();

    /**
     * 获取请求对象
     */
    Object getRequest();

    /**
     * 获取响应对象
     */
    Object getResponse();

    /**
     * 获取异常信息
     */
    Throwable getThrowable();

    /**
     * 获取上下文请求参数
     */
    Object getAttribute(Map<String, Object> key);

    /**
     * 设置请求规则
     */
    void setRule(Rule rule);

    /**
     * 设置请求返回结果
     */
    void setResponse();

    /**
     * 设置请求异常信息
     */
    void setThrowable(Throwable throwable);

    /**
     * 设置上下文参数
     */
    void setAttribute(String key, Object value);


    /**===========================netty==================================**/
    /**
     * 获取netty 上下文
     */
    ChannelHandlerContext getNettyCtx ();
    /**
     * 是否保持长链接
     */
    boolean isKeepAlive();

    /**
     * 释放资源
     */
    void releaseRequest();
    /**
     * 设置回调函数
     */
    void setCallback(Consumer<IContext> callback);

    /**
     * 调用回调函数
     */
    void invokeCompleteCallback();

}
